/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Copyright 2013, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */
#ifndef DWARF_H
#define DWARF_H

// tag
enum {
	DW_TAG_array_type				= 0x01,
	DW_TAG_class_type				= 0x02,
	DW_TAG_entry_point				= 0x03,
	DW_TAG_enumeration_type			= 0x04,
	DW_TAG_formal_parameter			= 0x05,
	DW_TAG_imported_declaration		= 0x08,
	DW_TAG_label					= 0x0a,
	DW_TAG_lexical_block			= 0x0b,
	DW_TAG_member					= 0x0d,
	DW_TAG_pointer_type				= 0x0f,
	DW_TAG_reference_type			= 0x10,
	DW_TAG_compile_unit				= 0x11,
	DW_TAG_string_type				= 0x12,
	DW_TAG_structure_type			= 0x13,
	DW_TAG_subroutine_type			= 0x15,
	DW_TAG_typedef					= 0x16,
	DW_TAG_union_type				= 0x17,
	DW_TAG_unspecified_parameters	= 0x18,
	DW_TAG_variant					= 0x19,
	DW_TAG_common_block				= 0x1a,
	DW_TAG_common_inclusion			= 0x1b,
	DW_TAG_inheritance				= 0x1c,
	DW_TAG_inlined_subroutine		= 0x1d,
	DW_TAG_module					= 0x1e,
	DW_TAG_ptr_to_member_type		= 0x1f,
	DW_TAG_set_type					= 0x20,
	DW_TAG_subrange_type			= 0x21,
	DW_TAG_with_stmt				= 0x22,
	DW_TAG_access_declaration		= 0x23,
	DW_TAG_base_type				= 0x24,
	DW_TAG_catch_block				= 0x25,
	DW_TAG_const_type				= 0x26,
	DW_TAG_constant					= 0x27,
	DW_TAG_enumerator				= 0x28,
	DW_TAG_file_type				= 0x29,
	DW_TAG_friend					= 0x2a,
	DW_TAG_namelist					= 0x2b,
	DW_TAG_namelist_item			= 0x2c,
	DW_TAG_packed_type				= 0x2d,
	DW_TAG_subprogram				= 0x2e,
	DW_TAG_template_type_parameter	= 0x2f,
	DW_TAG_template_value_parameter	= 0x30,
	DW_TAG_thrown_type				= 0x31,
	DW_TAG_try_block				= 0x32,
	DW_TAG_variant_part				= 0x33,
	DW_TAG_variable					= 0x34,
	DW_TAG_volatile_type			= 0x35,
	DW_TAG_dwarf_procedure			= 0x36,
	DW_TAG_restrict_type			= 0x37,
	DW_TAG_interface_type			= 0x38,
	DW_TAG_namespace				= 0x39,
	DW_TAG_imported_module			= 0x3a,
	DW_TAG_unspecified_type			= 0x3b,
	DW_TAG_partial_unit				= 0x3c,
	DW_TAG_imported_unit			= 0x3d,
	DW_TAG_condition				= 0x3f,
	DW_TAG_shared_type				= 0x40,
	DW_TAG_type_unit				= 0x41,
	DW_TAG_rvalue_reference_type	= 0x42,
	DW_TAG_template_alias			= 0x43,
	DW_TAG_coarray_type				= 0x44,
	DW_TAG_generic_subrange			= 0x45,
	DW_TAG_dynamic_type				= 0x46,
	DW_TAG_atomic_type				= 0x47,
	DW_TAG_call_site				= 0x48,
	DW_TAG_call_site_parameter		= 0x49,
	DW_TAG_skeleton_unit			= 0x4a,
	DW_TAG_immutable_type			= 0x4b,
	DW_TAG_lo_user					= 0x4080,
	DW_TAG_GNU_template_template_param
									= 0x4106,
	DW_TAG_GNU_template_parameter_pack
									= 0x4107,
	DW_TAG_GNU_formal_parameter_pack
									= 0x4108,
	DW_TAG_GNU_call_site			= 0x4109,
	DW_TAG_GNU_call_site_parameter	= 0x410a,
	DW_TAG_hi_user					= 0xffff
};

// has children flag value
enum {
	DW_CHILDREN_no	= 0x00,
	DW_CHILDREN_yes	= 0x01
};

// attribute name
enum {
	DW_AT_sibling				= 0x01,		// reference
	DW_AT_location				= 0x02,		// block, loclistptr
	DW_AT_name					= 0x03,		// string
	DW_AT_ordering				= 0x09,		// constant
	DW_AT_byte_size				= 0x0b,		// block, constant, reference
	DW_AT_bit_offset			= 0x0c,		// block, constant, reference
	DW_AT_bit_size				= 0x0d,		// block, constant, reference
	DW_AT_stmt_list				= 0x10,		// lineptr
	DW_AT_low_pc				= 0x11,		// address
	DW_AT_high_pc				= 0x12,		// address
	DW_AT_language				= 0x13,		// constant
	DW_AT_discr					= 0x15,		// reference
	DW_AT_discr_value			= 0x16,		// constant
	DW_AT_visibility			= 0x17,		// constant
	DW_AT_import				= 0x18,		// reference
	DW_AT_string_length			= 0x19,		// block, loclistptr
	DW_AT_common_reference		= 0x1a,		// reference
	DW_AT_comp_dir				= 0x1b,		// string
	DW_AT_const_value			= 0x1c,		// block, constant, string
	DW_AT_containing_type		= 0x1d,		// reference
	DW_AT_default_value			= 0x1e,		// reference
	DW_AT_inline				= 0x20,		// constant
	DW_AT_is_optional			= 0x21,		// flag
	DW_AT_lower_bound			= 0x22,		// block, constant, reference
	DW_AT_producer				= 0x25,		// string
	DW_AT_prototyped			= 0x27,		// flag
	DW_AT_return_addr			= 0x2a,		// block, loclistptr
	DW_AT_start_scope			= 0x2c,		// constant
	DW_AT_bit_stride			= 0x2e,		// constant
	DW_AT_upper_bound			= 0x2f,		// block, constant, reference
	DW_AT_abstract_origin		= 0x31,		// reference
	DW_AT_accessibility			= 0x32,		// constant
	DW_AT_address_class			= 0x33,		// constant
	DW_AT_artificial			= 0x34,		// flag
	DW_AT_base_types			= 0x35,		// reference
	DW_AT_calling_convention	= 0x36,		// constant
	DW_AT_count					= 0x37,		// block, constant, reference
	DW_AT_data_member_location	= 0x38,		// block, constant, loclistptr
	DW_AT_decl_column			= 0x39,		// constant
	DW_AT_decl_file				= 0x3a,		// constant
	DW_AT_decl_line				= 0x3b,		// constant
	DW_AT_declaration			= 0x3c,		// flag
	DW_AT_discr_list			= 0x3d,		// block
	DW_AT_encoding				= 0x3e,		// constant
	DW_AT_external				= 0x3f,		// flag
	DW_AT_frame_base			= 0x40,		// block, loclistptr
	DW_AT_friend				= 0x41,		// reference
	DW_AT_identifier_case		= 0x42,		// constant
	DW_AT_macro_info			= 0x43,		// macptr
	DW_AT_namelist_item			= 0x44,		// block
	DW_AT_priority				= 0x45,		// reference
	DW_AT_segment				= 0x46,		// block, loclistptr
	DW_AT_specification			= 0x47,		// reference
	DW_AT_static_link			= 0x48,		// block, loclistptr
	DW_AT_type					= 0x49,		// reference
	DW_AT_use_location			= 0x4a,		// block, loclistptr
	DW_AT_variable_parameter	= 0x4b,		// flag
	DW_AT_virtuality			= 0x4c,		// constant
	DW_AT_vtable_elem_location	= 0x4d,		// block, loclistptr
	DW_AT_allocated				= 0x4e,		// block, constant, reference
	DW_AT_associated			= 0x4f,		// block, constant, reference
	DW_AT_data_location			= 0x50,		// block
	DW_AT_byte_stride			= 0x51,		// block, constant, reference
	DW_AT_entry_pc				= 0x52,		// address
	DW_AT_use_UTF8				= 0x53,		// flag
	DW_AT_extension				= 0x54,		// reference
	DW_AT_ranges				= 0x55,		// rangelistptr
	DW_AT_trampoline			= 0x56,		// address, flag, reference, string
	DW_AT_call_column			= 0x57,		// constant
	DW_AT_call_file				= 0x58,		// constant
	DW_AT_call_line				= 0x59,		// constant
	DW_AT_description			= 0x5a,		// string
	DW_AT_binary_scale			= 0x5b,		// constant
	DW_AT_decimal_scale			= 0x5c,		// constant
	DW_AT_small					= 0x5d,		// reference
	DW_AT_decimal_sign			= 0x5e,		// constant
	DW_AT_digit_count			= 0x5f,		// constant
	DW_AT_picture_string		= 0x60,		// string
	DW_AT_mutable				= 0x61,		// flag
	DW_AT_threads_scaled		= 0x62,		// flag
	DW_AT_explicit				= 0x63,		// flag
	DW_AT_object_pointer		= 0x64,		// reference
	DW_AT_endianity				= 0x65,		// constant
	DW_AT_elemental				= 0x66,		// flag
	DW_AT_pure					= 0x67,		// flag
	DW_AT_recursive				= 0x68,		// flag
	DW_AT_signature				= 0x69,		// reference
	DW_AT_main_subprogram		= 0x6a,		// flag
	DW_AT_data_bit_offset		= 0x6b,		// constant
	DW_AT_const_expr			= 0x6c,		// flag
	DW_AT_enum_class			= 0x6d,		// flag
	DW_AT_linkage_name			= 0x6e,		// string
	DW_AT_string_length_bit_size
								= 0x6f,		// constant
	DW_AT_string_length_byte_size
								= 0x70,		// constant
	DW_AT_rank					= 0x71,		// constant, exprloc
	DW_AT_str_offsets_base		= 0x72,		// stroffsetsptr
	DW_AT_addr_base				= 0x73,		// addrptr
	DW_AT_rnglists_base			= 0x74,		// rnglistsptr
	DW_AT_dwo_name				= 0x76,		// string
	DW_AT_reference				= 0x77,		// flag
	DW_AT_rvalue_reference		= 0x78,		// flag
	DW_AT_macros				= 0x79,		// macptr
	DW_AT_call_all_calls		= 0x7a,		// flag
	DW_AT_call_all_source_calls	= 0x7b,		// flag
	DW_AT_call_all_tail_calls	= 0x7c,		// flag
	DW_AT_call_return_pc		= 0x7d,		// address
	DW_AT_call_value			= 0x7e,		// exprloc
	DW_AT_call_origin			= 0x7f,		// exprloc
	DW_AT_call_parameter		= 0x80,		// reference
	DW_AT_call_pc				= 0x81,		// address
	DW_AT_call_tail_call		= 0x82,		// flag
	DW_AT_call_target			= 0x83,		// exprloc
	DW_AT_call_target_clobbered	= 0x84,		// exprloc
	DW_AT_call_data_location	= 0x85,		// exprloc
	DW_AT_call_data_value		= 0x86,		// exprloc
	DW_AT_noreturn				= 0x87,		// flag
	DW_AT_alignment				= 0x88,		// constant
	DW_AT_export_symbols		= 0x89,		// flag
	DW_AT_deleted				= 0x8a,		// flag
	DW_AT_defaulted				= 0x8b,		// constant
	DW_AT_loclists_base			= 0x8c,		// loclistsptr
	DW_AT_lo_user				= 0x2000,
	DW_AT_call_site_value		= 0x2111,	// exprloc
	DW_AT_call_site_data_value
								= 0x2112,	// exprloc
	DW_AT_call_site_target
								= 0x2113,	// exprloc
	DW_AT_call_site_target_clobbered
								= 0x2114,	// exprloc
	DW_AT_tail_call				= 0x2115,	// flag
	DW_AT_all_tail_call_sites
								= 0x2116,	// flag
	DW_AT_all_call_sites		= 0x2117,	// flag
	DW_AT_all_source_call_sites
								= 0x2118,	// flag
	DW_AT_hi_user				= 0x3fff
};

// attribute form
enum {
	DW_FORM_addr		= 0x01,	// address
	DW_FORM_block2		= 0x03,	// block
	DW_FORM_block4		= 0x04,	// block
	DW_FORM_data2		= 0x05,	// constant
	DW_FORM_data4		= 0x06,	// constant, lineptr, loclistptr, macptr,
								// rangelistptr
	DW_FORM_data8		= 0x07,	// constant, lineptr, loclistptr, macptr,
								// rangelistptr
	DW_FORM_string		= 0x08,	// string
	DW_FORM_block		= 0x09,	// block
	DW_FORM_block1		= 0x0a,	// block
	DW_FORM_data1		= 0x0b,	// constant
	DW_FORM_flag		= 0x0c,	// flag
	DW_FORM_sdata		= 0x0d,	// constant
	DW_FORM_strp		= 0x0e,	// string
	DW_FORM_udata		= 0x0f,	// constant
	DW_FORM_ref_addr	= 0x10,	// reference
	DW_FORM_ref1		= 0x11,	// reference
	DW_FORM_ref2		= 0x12,	// reference
	DW_FORM_ref4		= 0x13,	// reference
	DW_FORM_ref8		= 0x14,	// reference
	DW_FORM_ref_udata	= 0x15,	// reference
	DW_FORM_indirect	= 0x16,	// form in .debug_info
	DW_FORM_sec_offset	= 0x17, // lineptr, loclistptr, macptr, rangelistptr
	DW_FORM_exprloc		= 0x18,	// dwarf expression
	DW_FORM_flag_present
						= 0x19,	// flag
	DW_FORM_strx		= 0x1a, // string
	DW_FORM_addrx		= 0x1b, // address
	DW_FORM_ref_sup4	= 0x1c, // reference
	DW_FORM_strp_sup	= 0x1d, // string
	DW_FORM_data16		= 0x1e, // constant
	DW_FORM_line_strp	= 0x1f, // string
	DW_FORM_ref_sig8	= 0x20,	// reference
	DW_FORM_implicit_const
						= 0x21, // constant
	DW_FORM_loclistx	= 0x22, // loclist
	DW_FORM_rnglistx	= 0x23, // rnglist
	DW_FORM_ref_sup8	= 0x24, // reference
	DW_FORM_strx1		= 0x25, // string
	DW_FORM_strx2		= 0x26, // string
	DW_FORM_strx3		= 0x27, // string
	DW_FORM_strx4		= 0x28, // string
	DW_FORM_addrx1		= 0x29, // address
	DW_FORM_addrx2		= 0x2a, // address
	DW_FORM_addrx3		= 0x2b, // address
	DW_FORM_addrx4		= 0x2c, // address

};

// expression operation
enum {
	DW_OP_addr					= 0x03,
	DW_OP_deref					= 0x06,
	DW_OP_const1u				= 0x08,
	DW_OP_const1s				= 0x09,
	DW_OP_const2u				= 0x0a,
	DW_OP_const2s				= 0x0b,
	DW_OP_const4u				= 0x0c,
	DW_OP_const4s				= 0x0d,
	DW_OP_const8u				= 0x0e,
	DW_OP_const8s				= 0x0f,
	DW_OP_constu				= 0x10,
	DW_OP_consts				= 0x11,
	DW_OP_dup					= 0x12,
	DW_OP_drop					= 0x13,
	DW_OP_over					= 0x14,
	DW_OP_pick					= 0x15,
	DW_OP_swap					= 0x16,
	DW_OP_rot					= 0x17,
	DW_OP_xderef				= 0x18,
	DW_OP_abs					= 0x19,
	DW_OP_and					= 0x1a,
	DW_OP_div					= 0x1b,
	DW_OP_minus					= 0x1c,
	DW_OP_mod					= 0x1d,
	DW_OP_mul					= 0x1e,
	DW_OP_neg					= 0x1f,
	DW_OP_not					= 0x20,
	DW_OP_or					= 0x21,
	DW_OP_plus					= 0x22,
	DW_OP_plus_uconst			= 0x23,
	DW_OP_shl					= 0x24,
	DW_OP_shr					= 0x25,
	DW_OP_shra					= 0x26,
	DW_OP_xor					= 0x27,
	DW_OP_skip					= 0x2f,
	DW_OP_bra					= 0x28,
	DW_OP_eq					= 0x29,
	DW_OP_ge					= 0x2a,
	DW_OP_gt					= 0x2b,
	DW_OP_le					= 0x2c,
	DW_OP_lt					= 0x2d,
	DW_OP_ne					= 0x2e,
	DW_OP_lit0					= 0x30,
	DW_OP_lit1					= 0x31,
	DW_OP_lit31					= 0x4f,
	DW_OP_reg0					= 0x50,
	DW_OP_reg1					= 0x51,
	DW_OP_reg31					= 0x6f,
	DW_OP_breg0					= 0x70,
	DW_OP_breg1					= 0x71,
	DW_OP_breg31				= 0x8f,
	DW_OP_regx					= 0x90,
	DW_OP_fbreg					= 0x91,
	DW_OP_bregx					= 0x92,
	DW_OP_piece					= 0x93,
	DW_OP_deref_size			= 0x94,
	DW_OP_xderef_size			= 0x95,
	DW_OP_nop					= 0x96,
	DW_OP_push_object_address	= 0x97,
	DW_OP_call2					= 0x98,
	DW_OP_call4					= 0x99,
	DW_OP_call_ref				= 0x9a,
	DW_OP_form_tls_address		= 0x9b,
	DW_OP_call_frame_cfa		= 0x9c,
	DW_OP_bit_piece				= 0x9d,
	DW_OP_implicit_value		= 0x9e,
	DW_OP_stack_value			= 0x9f,
	DW_OP_implicit_pointer		= 0xa0,
	DW_OP_addrx					= 0xa1,
	DW_OP_constx				= 0xa2,
	DW_OP_entry_value			= 0xa3,
	DW_OP_const_type			= 0xa4,
	DW_OP_regval_type			= 0xa5,
	DW_OP_deref_type			= 0xa6,
	DW_OP_xderef_type			= 0xa7,
	DW_OP_convert				= 0xa8,
	DW_OP_reinterpret			= 0xa9,
	DW_OP_lo_user				= 0xe0,
	DW_OP_hi_user				= 0xff
};

// base type
enum {
	DW_ATE_address			= 0x01,
	DW_ATE_boolean			= 0x02,
	DW_ATE_complex_float	= 0x03,
	DW_ATE_float			= 0x04,
	DW_ATE_signed			= 0x05,
	DW_ATE_signed_char		= 0x06,
	DW_ATE_unsigned			= 0x07,
	DW_ATE_unsigned_char	= 0x08,
	DW_ATE_imaginary_float	= 0x09,
	DW_ATE_packed_decimal	= 0x0a,
	DW_ATE_numeric_string	= 0x0b,
	DW_ATE_edited			= 0x0c,
	DW_ATE_signed_fixed		= 0x0d,
	DW_ATE_unsigned_fixed	= 0x0e,
	DW_ATE_decimal_float	= 0x0f,
	DW_ATE_UTF				= 0x10,
	DW_ATE_UCS				= 0x11,
	DW_ATE_ASCII			= 0x12,
	DW_ATE_lo_user			= 0x80,
	DW_ATE_hi_user			= 0xff
};

// decimal sign
enum {
	DW_DS_unsigned				= 0x01,
	DW_DS_leading_overpunch		= 0x02,
	DW_DS_trailing_overpunch	= 0x03,
	DW_DS_leading_separate		= 0x04,
	DW_DS_trailing_separate		= 0x05
};

// endianess
enum {
	DW_END_default		= 0x00,
	DW_END_big			= 0x01,
	DW_END_little		= 0x02,
	DW_END_lo_user		= 0x40,
	DW_END_hi_user		= 0xff
};

// accessibility
enum {
	DW_ACCESS_public	= 0x01,
	DW_ACCESS_protected	= 0x02,
	DW_ACCESS_private	= 0x03
};

// visibility
enum {
	DW_VIS_local		= 0x01,
	DW_VIS_exported		= 0x02,
	DW_VIS_qualified	= 0x03
};

// virtuality
enum {
	DW_VIRTUALITY_none			= 0x00,
	DW_VIRTUALITY_virtual		= 0x01,
	DW_VIRTUALITY_pure_virtual	= 0x02
};

// source language
enum {
	DW_LANG_C89				= 0x0001,
	DW_LANG_C				= 0x0002,
	DW_LANG_Ada83			= 0x0003,
	DW_LANG_C_plus_plus		= 0x0004,
	DW_LANG_Cobol74			= 0x0005,
	DW_LANG_Cobol85			= 0x0006,
	DW_LANG_Fortran77		= 0x0007,
	DW_LANG_Fortran90		= 0x0008,
	DW_LANG_Pascal83		= 0x0009,
	DW_LANG_Modula2			= 0x000a,
	DW_LANG_Java			= 0x000b,
	DW_LANG_C99				= 0x000c,
	DW_LANG_Ada95			= 0x000d,
	DW_LANG_Fortran95		= 0x000e,
	DW_LANG_PLI				= 0x000f,
	DW_LANG_ObjC			= 0x0010,
	DW_LANG_ObjC_plus_plus	= 0x0011,
	DW_LANG_UPC				= 0x0012,
	DW_LANG_D				= 0x0013,
	DW_LANG_Python			= 0x0014,
	DW_LANG_OpenCL			= 0x0015,
	DW_LANG_Go				= 0x0016,
	DW_LANG_Modula3			= 0x0017,
	DW_LANG_Haskell			= 0x0018,
	DW_LANG_C_plus_plus_03	= 0x0019,
	DW_LANG_C_plus_plus_11	= 0x001a,
	DW_LANG_OCaml			= 0x001b,
	DW_LANG_Rust			= 0x001c,
	DW_LANG_C11				= 0x001d,
	DW_LANG_Swift			= 0x001e,
	DW_LANG_Julia			= 0x001f,
	DW_LANG_Dylan			= 0x0020,
	DW_LANG_C_plus_plus_14	= 0x0021,
	DW_LANG_Fortran03		= 0x0022,
	DW_LANG_Fortran08		= 0x0023,
	DW_LANG_RenderScript	= 0x0024,
	DW_LANG_BLISS			= 0x0025,
	DW_LANG_lo_user			= 0x8000,
	DW_LANG_hi_user			= 0xffff
};

// identifier case
enum {
	DW_ID_case_sensitive	= 0x00,
	DW_ID_up_case			= 0x01,
	DW_ID_down_case			= 0x02,
	DW_ID_case_insensitive	= 0x03
};

// calling convention
enum {
	DW_CC_normal			= 0x01,
	DW_CC_program			= 0x02,
	DW_CC_nocall			= 0x03,
	DW_CC_pass_by_reference	= 0x04,
	DW_CC_pass_by_value		= 0x05,
	DW_CC_lo_user			= 0x40,
	DW_CC_hi_user			= 0xff
};

// inlining
enum {
	DW_INL_not_inlined			= 0x00,
	DW_INL_inlined				= 0x01,
	DW_INL_declared_not_inlined	= 0x02,
	DW_INL_declared_inlined		= 0x03
};

// array ordering
enum {
	DW_ORD_row_major			= 0x00,
	DW_ORD_col_major			= 0x01
};

// discriminant descriptor
enum {
	DW_DSC_label			= 0x00,
	DW_DSC_range			= 0x01
};

// line number standard opcode
enum {
	DW_LNS_copy					= 0x01,
	DW_LNS_advance_pc			= 0x02,
	DW_LNS_advance_line			= 0x03,
	DW_LNS_set_file				= 0x04,
	DW_LNS_set_column			= 0x05,
	DW_LNS_negate_stmt			= 0x06,
	DW_LNS_set_basic_block		= 0x07,
	DW_LNS_const_add_pc			= 0x08,
	DW_LNS_fixed_advance_pc		= 0x09,
	DW_LNS_set_prologue_end		= 0x0a,
	DW_LNS_set_epilogue_begin	= 0x0b,
	DW_LNS_set_isa				= 0x0c
};

// line number extended opcode
enum {
	DW_LNE_end_sequence			= 0x01,
	DW_LNE_set_address			= 0x02,
	DW_LNE_define_file			= 0x03,
	DW_LNE_set_discriminator 	= 0x04,
	DW_LNE_lo_user				= 0x80,
	DW_LNE_hi_user				= 0xff
};

// line number header entry format
enum {
	DW_LNCT_path				= 0x0001,
	DW_LNCT_directory_index		= 0x0002,
	DW_LNCT_timestamp			= 0x0003,
	DW_LNCT_size				= 0x0004,
	DW_LNCT_MD5					= 0x0005,
	DW_LNCT_lo_user				= 0x2000,
	DW_LNCT_hi_user				= 0x3fff
};

// macro information type
enum {
	DW_MACINFO_define		= 0x01,
	DW_MACINFO_undef		= 0x02,
	DW_MACINFO_start_file	= 0x03,
	DW_MACINFO_end_file		= 0x04,
	DW_MACINFO_vendor_ext	= 0xff
};

// call frame instruction (high 2 bits for the first 3 items, low 6 bits for
// the remaining ones)
enum {
	DW_CFA_advance_loc			= 0x1,	// high 2 bits
	DW_CFA_offset				= 0x2,	// high 2 bits
	DW_CFA_restore				= 0x3,	// high 2 bits
	DW_CFA_nop					= 0,	// whole byte
	DW_CFA_set_loc				= 0x01,
	DW_CFA_advance_loc1			= 0x02,
	DW_CFA_advance_loc2			= 0x03,
	DW_CFA_advance_loc4			= 0x04,
	DW_CFA_offset_extended		= 0x05,
	DW_CFA_restore_extended		= 0x06,
	DW_CFA_undefined			= 0x07,
	DW_CFA_same_value			= 0x08,
	DW_CFA_register				= 0x09,
	DW_CFA_remember_state		= 0x0a,
	DW_CFA_restore_state		= 0x0b,
	DW_CFA_def_cfa				= 0x0c,
	DW_CFA_def_cfa_register		= 0x0d,
	DW_CFA_def_cfa_offset		= 0x0e,
	DW_CFA_def_cfa_expression	= 0x0f,
	DW_CFA_expression			= 0x10,
	DW_CFA_offset_extended_sf	= 0x11,
	DW_CFA_def_cfa_sf			= 0x12,
	DW_CFA_def_cfa_offset_sf	= 0x13,
	DW_CFA_val_offset			= 0x14,
	DW_CFA_val_offset_sf		= 0x15,
	DW_CFA_val_expression		= 0x16,
	DW_CFA_lo_user				= 0x1c,
	DW_CFA_hi_user				= 0x3f,

	// extensions
    DW_CFA_MIPS_advance_loc8	= 0x1d,
    DW_CFA_GNU_window_save		= 0x2d,
    DW_CFA_GNU_args_size		= 0x2e,
    DW_CFA_GNU_negative_offset_extended	= 0x2f
};

// unit type
enum {
	DW_UT_compile				= 0x01,
	DW_UT_type					= 0x02,
	DW_UT_partial				= 0x03,
	DW_UT_skeleton				= 0x04,
	DW_UT_split_compile			= 0x05,
	DW_UT_split_type			= 0x06,
	DW_UT_lo_user				= 0x80,
	DW_UT_hi_user				= 0xff
};


enum dwarf_reference_type {
	dwarf_reference_type_local = 0,
	dwarf_reference_type_global,
	dwarf_reference_type_signature
};


#endif	// DWARF_H
